﻿// See https://aka.ms/new-console-template for more information
using CSharpNewFeaturesUse;

Console.WriteLine("Program Starts From Here!\n");

// 1. 使用Range 及 Index
Console.WriteLine(nameof(RangeAndIndex));
RangeAndIndex.ShowUse();
Console.WriteLine();

// 2. 扩展方法（Extension methods）
Console.WriteLine(nameof(ExtensionMethods));
// 使用针对object的扩展
0.ShowUse();
new RangeAndIndex().ShowUse();
// 之前需要通过调用静态方法，传入参数的方式使用，例如ShowUse(object)
Console.WriteLine();

// 3. 只读属性
Console.WriteLine(nameof(ReadOnly));
new ReadOnly().ShowUse();
Console.WriteLine();

// 4. Switch Expression
Console.WriteLine(nameof(SwitchExpression));
SwitchExpression.ShowUse();
// 之前要用两步，第一步判断，第二步赋值
Console.WriteLine();

// 5. Records
Console.WriteLine(nameof(Records));
Records.ShowUse();
Console.WriteLine();

// 6. 展开运算符
Console.WriteLine(nameof(Spread));
Spread.ShowUse();
// 之前要先创建对应大小的集合，然后再遍历填入
Console.WriteLine();

// 7. 列表的模式匹配（List patterns）
Console.WriteLine(nameof(ListPatternMatch));
ListPatternMatch.ShowUse();
// 之前要依次遍历判断
Console.WriteLine();

// 8. 闭包(closure)
Console.WriteLine(nameof(Closure));
new Closure().ShowUse();
// 之前需要手动将外部变量作为参数传入lambda表达式
Console.WriteLine();

// 9. Disposable的struct
Console.WriteLine(nameof(DisposableClass));
DisposableClass.ShowUse();
// 之前需要在struct生命周期结束后手动调用struct内实现的结束函数
Console.WriteLine();

// 10. 对于数值的泛型支持（所有的数值 ，包括Int32，实现了INumber<int>接口
Console.WriteLine(nameof(INumberClass));
// 使用针对INumber<T>的扩展
1.ShowUse1();
// 之前需要依次对数值类型实现，而不能用泛型概括所有数值类型
Console.WriteLine();

Console.WriteLine("Program Ends Here!\n");